package com.summer.bilibili.model;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;

import java.io.Serializable;
import java.util.List;


/**
 * 描述媒体文件（如视频/音频）的元数据信息
 */
@Data
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class MediaInfo implements Serializable {
    private List < Stream > streams; // 媒体流列表
    private Format format; // 媒体容器格式信息

    /**
     * 描述单条媒体流信息
     */
    @Data
    //自动将 Java 的驼峰命名字段（如 codecName）映射为 JSON 的蛇形命名（codec_name）
    @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
    public static class Stream {
        private int index; // 流索引
        //h264
        private String codecName;// 编解码器短名
        //H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
        private String codecLongName; //编解码器全称
        //High
        private String profile;// 编码配置
        private String codecType; // video or audio，流类型
        private String codecTagString; // 编解码器标签字符串
        private int width;
        private int height; // 视频分辨率
        // 34080046
        private long durationTs; // 事件戳时长
        // 1420.001917(秒)
        private String duration; // 可读时长
    }

    /**
     * 描述容器格式信息
     */
    @Data
    @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
    public static class Format {
        private String filename; // 文件名
        private String formatName; // 容器格式
        // 1420.061995
        private String duration; //总时长s
        private String size; // 文件大小
        private String bitRate; // 比特率
        private FormatTags tags; // 标签格式，如编码器
    }

    /**
     * 容器格式的标签信息
     */
    @Data
    @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
    public static class FormatTags {
        private String encoder; // 编码器名称
    }
}
